﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Data;
using System.Linq;
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using produccion.modelo;
using produccion.clases;
using produccion.Conexion;
using produccion.reportes;
using Oracle.DataAccess.Client;

namespace produccion.modulos
{
    public interface IFacturaVarios
    {
        void ImprimirDatos(string strNroFactura, string strEmpresa, string strImpresora, out string strMensaje, short numCopias, string strTipoDocumento, bool logPreviewPDF, bool logAnulada);
    }

    [Export(typeof(IFacturaVarios))]
    class ImprimirFacturaVarios:IFacturaVarios
    {
        public static string strBaseDatos;

        #region Campos
            private int numPaginaActual = 1;
            private PrintDocument _print = new PrintDocument();
            private DataSet _dts;
            private int _numCopias = 0;
            private bool _logPreviewPDF = false;
            private bool _logAnulada = false;
            private int numColumna = 0;
            private int numFila = 0;
            private int numProductos = 0;
            private int numPaginas = 0;
            private int numCuentaLinea = 0;
            private Int32 numTotalProductos = 0;
            private Int32 numPrecioAnterior = 0;
            private string strPedidos = "";
            private string strOrdenes = "";
            private string strReferencia = "";
            private string strTipodeDocumento = "";
        #endregion

        #region Constructor
            [ImportingConstructor]
            public ImprimirFacturaVarios()
            {
                _print.PrintPage += _print_PrintPage;
            }
        #endregion

        #region Metodos
            public void ImprimirDatos(string strNroFactura, string strEmpresa, string strImpresora, out string strMensaje, short numCopias, string strTipoDocumento, bool logPreviewPDF, bool logAnulada)
            {
                try
                {
                    strTipodeDocumento = strTipoDocumento;
                    OracleConexion oc = new OracleConexion(strBaseDatos);  
                    var r1 = new OracleParameter("p_strFactura", OracleDbType.Varchar2, strNroFactura, ParameterDirection.Input);
                    var r2 = new OracleParameter("p_strEmpresa", OracleDbType.Varchar2, strEmpresa, ParameterDirection.Input);
                    var r3 = new OracleParameter("p_ResultSet", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r4 = new OracleParameter("p_ResultSet2", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r5 = new OracleParameter("p_ResultSet5", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r6 = new OracleParameter("p_ResultSet7", OracleDbType.RefCursor, ParameterDirection.Output);
                    var parametros = new List<OracleParameter> { r1, r2, r3, r4, r5, r6 };
                    DataSet dts = oc.EjecutarSp<DataSet>("SP_IMPRIMEFACTURAVARIOS", parametros);

                    if (dts != null)
                    {
                        if (dts.Tables.Count > 3)
                        {
                            _dts = dts;
                            _numCopias = numCopias;
                            _logPreviewPDF = logPreviewPDF;
                            _logAnulada = logAnulada;
                            _print.DefaultPageSettings.PaperSize = new PaperSize("letter", 850, 1050); //1100
                            //_print.PrinterSettings.Duplex = Duplex.Simplex;
                            _print.PrinterSettings.PrinterName = strImpresora;
                            _print.PrinterSettings.Copies = numCopias; //3
                            _print.PrintController = new StandardPrintController();
                            _print.Print();
                            strMensaje = "";
                        }
                        else
                        {
                            strMensaje = "No hay datos para cargar.";
                        }
                    }
                    else
                    {
                        strMensaje = "No hay datos para cargar.";
                    }
                }
                catch (Exception ex) 
                { 
                    strMensaje = ex.Message;
                }
            }

            private void imprimirPDF()
            {
                #region Crea el dataset, los datatables y las variables                
                DataSet ds = new DataSet("dsFacturaVarios");

                DataTable dtEmpresa = new DataTable("dtEmpresa");
                DataTable dtCliente = new DataTable("dtCliente");
                DataTable dtEncFactura = new DataTable("dtEncFactura");
                DataTable dtDetFactura = new DataTable("dtDetFactura");

                Double numTotaldeArticulos = 0;
                Double numTotal = 0;
                Double numSubtotalFactura = 0;

                string strNumFactura = "";
                #endregion

                #region Llena los datatables                
                dtEmpresa = _dts.Tables[0];
                dtEmpresa.TableName = "dtEmpresa";
                dtCliente = _dts.Tables[1];
                dtCliente.TableName = "dtCliente";                
                
                dtDetFactura.TableName = "dtDetFactura";
                dtDetFactura.Columns.Add("CONSEC_DFA", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("CODREF_DFA", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("NOMREF_DFA", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("CANREF_DFA", System.Type.GetType("System.Double"));
                dtDetFactura.Columns.Add("PREREF_DFA", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("IVAREF_DFA", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("DTOREF_DFA", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("TOTAL", System.Type.GetType("System.Double"));

                DataRow drDetFactura = dtDetFactura.NewRow();

                if (_dts.Tables[3].Rows.Count > 0)
                {
                    foreach (DataRow dr in _dts.Tables[3].Rows)
                    {
                        drDetFactura["CONSEC_DFA"] = dr["CONSEC_DFA"].ToString().Trim();
                        drDetFactura["CODREF_DFA"] = dr["CODREF_DFA"].ToString().Trim();
                        drDetFactura["NOMREF_DFA"] = dr["NOMREF_DFA"].ToString().Trim();
                        drDetFactura["CANREF_DFA"] = Convert.ToDouble(dr["CANREF_DFA"]);
                        drDetFactura["PREREF_DFA"] = Convert.ToInt32(dr["PREREF_DFA"]);
                        drDetFactura["IVAREF_DFA"] = Convert.ToInt32(dr["IVAREF_DFA"]);
                        drDetFactura["DTOREF_DFA"] = Convert.ToInt32(dr["DTOREF_DFA"]);

                        if (Convert.ToDouble(dr["CANREF_DFA"]) > 0)
                        {
                            if (Convert.ToInt32(dr["DTOREF_DFA"]) > 0)
                                numTotal = (Convert.ToDouble(dr["CANREF_DFA"]) * Convert.ToInt32(dr["PREREF_DFA"]) * (1 - (Convert.ToInt32(dr["DTOREF_DFA"]) / 100)));
                            else
                                numTotal = Convert.ToDouble(dr["CANREF_DFA"]) * Convert.ToInt32(dr["PREREF_DFA"]);

                            drDetFactura["TOTAL"] = numTotal;
                            numTotaldeArticulos = numTotaldeArticulos + Convert.ToDouble(dr["CANREF_DFA"]);
                            numSubtotalFactura = numSubtotalFactura + numTotal;
                        }

                        dtDetFactura.Rows.Add(drDetFactura);

                        drDetFactura = dtDetFactura.NewRow();

                    }
                }

                dtEncFactura.TableName = "dtEncFactura";
                dtEncFactura.Columns.Add("NROFAC_EFA", System.Type.GetType("System.String"));
                dtEncFactura.Columns.Add("FECFAC_EFA", System.Type.GetType("System.DateTime"));
                dtEncFactura.Columns.Add("VTOFAC_EFA", System.Type.GetType("System.DateTime"));
                dtEncFactura.Columns.Add("VALFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("IVAFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("RTEFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("DTOFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("ABOFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("FLETE_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("STRVALOR", System.Type.GetType("System.String"));
                dtEncFactura.Columns.Add("STRRESOLUCION", System.Type.GetType("System.String"));
                dtEncFactura.Columns.Add("NUMUNIDADES", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("NUMSUBTOTAL", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("TIPODOCUMENTO", System.Type.GetType("System.String"));

                dtEncFactura.TableName = "dtEncFactura";
                DataRow drEncFactura = dtEncFactura.NewRow();
                drEncFactura["NROFAC_EFA"] = _dts.Tables[2].Rows[0]["NROFAC_EFA"].ToString();
                strNumFactura = _dts.Tables[2].Rows[0]["NROFAC_EFA"].ToString().Trim();
                drEncFactura["FECFAC_EFA"] = Convert.ToDateTime(_dts.Tables[2].Rows[0]["FECFAC_EFA"]).ToString("dd/MM/yyyy");
                drEncFactura["VTOFAC_EFA"] = Convert.ToDateTime(_dts.Tables[2].Rows[0]["VTOFAC_EFA"]).ToString("dd/MM/yyyy");
                drEncFactura["VALFAC_EFA"] = Convert.ToInt32(_dts.Tables[2].Rows[0]["VALFAC_EFA"]);
                drEncFactura["IVAFAC_EFA"] = Convert.ToInt32(_dts.Tables[2].Rows[0]["IVAFAC_EFA"]);
                drEncFactura["RTEFAC_EFA"] = Convert.ToInt32(_dts.Tables[2].Rows[0]["RTEFAC_EFA"]);
                drEncFactura["DTOFAC_EFA"] = Convert.ToInt32(_dts.Tables[2].Rows[0]["DTOFAC_EFA"]);
                drEncFactura["ABOFAC_EFA"] = Convert.ToInt32(_dts.Tables[2].Rows[0]["ABOFAC_EFA"]);
                drEncFactura["FLETE_EFA"] = Convert.ToInt32(_dts.Tables[2].Rows[0]["FLETE_EFA"]);
                drEncFactura["STRVALOR"] = _dts.Tables[2].Rows[0]["STRVALOR"].ToString();
                drEncFactura["STRRESOLUCION"] = _dts.Tables[2].Rows[0]["STRRESOLUCION"].ToString();
                drEncFactura["NUMUNIDADES"] = numTotaldeArticulos;
                drEncFactura["NUMSUBTOTAL"] = numSubtotalFactura;
                drEncFactura["TIPODOCUMENTO"] = strTipodeDocumento;

                dtEncFactura.Rows.Add(drEncFactura);
                #endregion

                ds.Tables.Add(dtEmpresa.Copy());
                ds.Tables.Add(dtCliente.Copy());
                ds.Tables.Add(dtEncFactura.Copy());
                ds.Tables.Add(dtDetFactura);

                if (_logPreviewPDF == true)
                {
                    if (_logAnulada == true)
                    {
                        Vista vista = new Vista { ds = ds, reporte = @"reportes\rptFacturaVariosAnulada.rpt" };
                        vista.Show();
                    }
                    else
                    {
                        Vista vista = new Vista { ds = ds, reporte = @"reportes\rptFacturaVarios.rpt" };
                        vista.Show();
                    }
                }
                else
                {
                    String StrNombreOriginal, StrRutaExporta, StrNombreNuevo, StrExtencionArchivo = "";
                    StrExtencionArchivo = "pdf";
                    StrNombreNuevo = strNumFactura;
                    StrNombreOriginal = @"reportes\rptFacturaVarios.rpt";// Asignamos la ruta donde esta el reporte origina que se va a cargar
                    StrRutaExporta = @"\\10.1.1.7\publica\Artesa\FACTURAS\";// Asignamos la ruta donde se exportara el archivo

                    if (File.Exists(StrRutaExporta + StrNombreNuevo + "." + StrExtencionArchivo))
                    {
                        foreach (Process proceso in Process.GetProcesses())
                        {
                            if (proceso.ProcessName == "glcnd" || proceso.ProcessName == "AcroRd32")
                            {
                                proceso.Kill();
                            }
                        }
                        File.Delete(StrRutaExporta + StrNombreNuevo + "." + StrExtencionArchivo);
                    }

                    if (_logAnulada == true)
                    {
                        StrNombreOriginal = @"reportes\rptFacturaVariosAnulada.rpt";// Asignamos la ruta donde esta el reporte origina que se va a cargar
                        Vista FrmReporte = new Vista();// Cargamos las clases que necesitamos que estan en este formulario
                        FrmReporte.ExportarCrystalReport(ds, StrNombreOriginal, StrRutaExporta, StrNombreNuevo, StrExtencionArchivo);// Enviamos la impresion
                    }
                    else
                    {
                        Vista FrmReporte = new Vista();// Cargamos las clases que necesitamos que estan en este formulario
                        FrmReporte.ExportarCrystalReport(ds, StrNombreOriginal, StrRutaExporta, StrNombreNuevo, StrExtencionArchivo);// Enviamos la impresion
                    }

                    
                }

            }

            private void imprimirPagina1(PrintPageEventArgs e)
            {
                if (_numCopias > 0)
                {

                    #region variables
                    var dtEmpresa = _dts.Tables[0];
                    var dtCliente = _dts.Tables[1];
                    var dtEncFactura = _dts.Tables[2];
                    var dtDetFactura = _dts.Tables[3];

                    int fontsize = 6;
                    var xbrushes = Brushes.Black;
                    var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                    var fuentenormal = new Font("Tahoma", fontsize);
                    var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                    var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                    var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                    var fuentelistadetalle = new Font("Arial", 5);
                    var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                    var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                    int numCantidadTallas = 0;
                    int numLargoTitulo = 0;
                    int numGuardaFila = 0;
                    int numPar = 0;
                    Int32 numArticulos = 0;
                    int numTamañoRef = 0;
                    int numIzquierda = 550; //560

                    StringFormat formato1 = new StringFormat();
                    formato1.Alignment = StringAlignment.Far;
                    formato1.LineAlignment = StringAlignment.Far;
                    #endregion

                    #region calculos y llena variables
                    // cuenta las tallas
                    numCantidadTallas = 0; ;

                    // cuenta los productos
                    numProductos = dtDetFactura.Rows.Count;

                    // Acumula los pedidos en una variable
                    strPedidos = "";

                    // Acumula las ordenes de pedido en una variable 
                    strOrdenes = "";


                    // averigua el numero de páginas
                    if (numProductos > 0 && numProductos < 39)
                        numPaginas = 1;
                    if (numProductos > 38 && numProductos < 89)
                        numPaginas = 2;
                    if (numProductos > 88 && numProductos < 139)
                        numPaginas = 3;
                    if (numProductos > 138 && numProductos < 189)
                        numPaginas = 4;
                    if (numProductos > 188 && numProductos < 227)
                        numPaginas = 5;
                    #endregion

                    #region encabezado
                    // Imprime el logo
                    Image logo = Properties.Resources.artesalogo;
                    e.Graphics.DrawImage(logo, 8, 10);

                    // Titulo factura con numero
                    e.Graphics.FillRectangle(Brushes.LightGray, numIzquierda, 20, 220, 40); //560,20,220,40
                    e.Graphics.DrawString(strTipodeDocumento, fuentegrande, xbrushes, 590, 23); // 600,23
                    e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 635, 40); //645,40

                    // Control de paginacion
                    e.Graphics.DrawString("Página:   1  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 695, 65); //705,65

                    // Cuadro superior derecho
                    e.Graphics.DrawRectangle(pen, new Rectangle(numIzquierda, 85, 220, 33)); //560, 85, 220, 33
                    e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                    e.Graphics.DrawLine(pen, numIzquierda, 96, 770, 96); //560,96,780,96
                    e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                    e.Graphics.DrawLine(pen, numIzquierda, 107, 770, 107); //560,107,780,107
                    e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                    #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                    DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                    DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                    DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                    TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                    int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                    #endregion

                    e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                    e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                    //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                    e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                    e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                    // Informacion empresa en la parte superior izquierda
                    e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                    e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                    e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                    // Cuado izquierdo vendido a
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                    e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                    e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                    e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                    e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                    e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString().Trim(), fuentetitulo, xbrushes, 90, 173);
                    //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                    e.Graphics.DrawString("VIA: ", fuentetitulo, xbrushes, 90, 183);

                    // Cuadro derecho pedidos y ordenes
                    e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 375, 60));  //395, 140, 385, 60
                    e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                    e.Graphics.DrawLine(pen, 395, 160, 770, 160);  //395, 160, 780, 160
                    if (strOrdenes.Length < 66)
                    {
                        e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                    }
                    else
                    {
                        e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                        //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                        e.Graphics.DrawString(strOrdenes.Substring(67), fuentetitulo, xbrushes, 400, 185);
                    }
                    #endregion

                    #region Titulos del Detalle factura
                    //Encabezado de items de la factura
                    numLargoTitulo = (numCantidadTallas * 10) + 20;
                    e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 755, numLargoTitulo); //15, 210, 765
                    e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 216);
                    e.Graphics.DrawLine(pen, 80, 210, 80, 210 + numLargoTitulo);
                    e.Graphics.DrawString("Descripción", fuentetitulo, xbrushes, 82, 216);
                    e.Graphics.DrawLine(pen, 540, 210, 540, 210 + numLargoTitulo); //550, 210, 550, 210
                    e.Graphics.DrawString("Cantidad", fuentetitulo, xbrushes, 542, 216); //555, 216
                    e.Graphics.DrawLine(pen, 587, 210, 587, 210 + numLargoTitulo); //610, 210, 610, 210
                    e.Graphics.DrawString("Descuento", fuentetitulo, xbrushes, 590, 216); //615, 216
                    e.Graphics.DrawLine(pen, 643, 210, 643, 210 + numLargoTitulo); //670, 210, 670, 210
                    // Parte final del encabezado de items de la factura
                    e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 650, 216); //660, 216
                    e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo); //725, 210, 725, 210 
                    e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 720, 216); //720, 216

                    #endregion

                    #region Detalle factura
                    numFila = 205;
                    numColumna = 200;
                    numGuardaFila = numFila + 15;
                    numFila = numFila + 25;
                    numCuentaLinea = 0;
                    strReferencia = "";
                    numTotalProductos = 0;
                    numPar = 1;
                    double numValorDcto = 0;

                    // Detalle de la factura
                    foreach (DataRow dr in dtDetFactura.Rows)
                    {
                        numCuentaLinea++;

                        if (numPaginas == 1 && numCuentaLinea < 39)
                        {

                            numTamañoRef = dr["NOMREF_DFA"].ToString().Trim().Length;

                            e.Graphics.DrawString(dr["CODREF_DFA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(dr["NOMREF_DFA"].ToString(), fuentedetalle, xbrushes, 82, numFila + 2);
                            e.Graphics.DrawString(dr["CANREF_DFA"].ToString(), fuentedetalle, xbrushes, 570, numFila + 2);
                            e.Graphics.DrawString(dr["DTOREF_DFA"].ToString(), fuentedetalle, xbrushes, 620, numFila + 2); //635
                            var xprecio = Convert.ToDouble(dr["PREREF_DFA"].ToString());
                            var xcanti = Convert.ToDouble(dr["CANREF_DFA"].ToString());
                            var xdcto = Convert.ToDouble(dr["DTOREF_DFA"].ToString());
                            numValorDcto = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : 0;

                            var valor = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : (xcanti * xprecio);
                            e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", xprecio), fuentedetalle, xbrushes, new Rectangle(635, numFila, 60, 13), formato1); //655, numFila, 60, 13
                            e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", valor), fuentedetalle, xbrushes, new Rectangle(705, numFila, 60, 13), formato1);

                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANREF_DFA"]);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 755, 15); //15, numFila, 765, 15
                        }

                        if (numPaginas > 1 && numCuentaLinea < 51)
                        {

                            numTamañoRef = dr["NOMREF_DFA"].ToString().Trim().Length;

                            e.Graphics.DrawString(dr["CODREF_DFA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(dr["NOMREF_DFA"].ToString(), fuentedetalle, xbrushes, 82, numFila + 2);
                            e.Graphics.DrawString(dr["CANREF_DFA"].ToString(), fuentedetalle, xbrushes, 570, numFila + 2);
                            e.Graphics.DrawString(dr["DTOREF_DFA"].ToString(), fuentedetalle, xbrushes, 620, numFila + 2); //635
                            var xprecio = Convert.ToDouble(dr["PREREF_DFA"].ToString());
                            var xcanti = Convert.ToDouble(dr["CANREF_DFA"].ToString());
                            var xdcto = Convert.ToDouble(dr["DTOREF_DFA"].ToString());
                            numValorDcto = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : 0;

                            var valor = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : (xcanti * xprecio);
                            e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", xprecio), fuentedetalle, xbrushes, new Rectangle(635, numFila, 60, 13), formato1); //655, numFila, 60, 13
                            e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", valor), fuentedetalle, xbrushes, new Rectangle(705, numFila, 60, 13), formato1);

                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANREF_DFA"]);
                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 755, 15); //15, numFila, 765, 15
                        }
                    }

                    // Lineas verticales den el detalle de la factura
                    e.Graphics.DrawLine(pen, 80, numGuardaFila, 80, numFila);
                    e.Graphics.DrawLine(pen, 540, numGuardaFila, 540, numFila); //550
                    e.Graphics.DrawLine(pen, 587, numGuardaFila, 587, numFila); //610
                    e.Graphics.DrawLine(pen, 643, numGuardaFila, 643, numFila); //670
                    e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila); //725

                    #endregion

                    #region Pie de factura
                    if (numPaginas == 1)
                    {
                        // Cuadro inferior de totales
                        e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 750, 125)); //15, 850, 760, 125
                        e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                        e.Graphics.DrawLine(pen, 580, 875, 765, 875); // 580, 875, 775, 875
                        e.Graphics.DrawLine(pen, 580, 895, 765, 895); // 580, 895, 775, 895
                        e.Graphics.DrawLine(pen, 580, 915, 765, 915); // 580, 915, 775, 915
                        e.Graphics.DrawLine(pen, 580, 935, 765, 935); // 580, 935, 775, 935
                        e.Graphics.DrawLine(pen, 580, 955, 765, 955); // 580, 955, 775, 955
                        e.Graphics.DrawLine(pen, 580, 975, 765, 975); // 580, 975, 775, 975

                        e.Graphics.DrawLine(pen, 670, 850, 670, 975);

                        e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                        e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 878);
                        e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 898);
                        e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 918);
                        e.Graphics.DrawString("DESCUENTO", fuentetitulo, xbrushes, 585, 938);
                        e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 958);

                        e.Graphics.DrawLine(pen, 15, 895, 580, 895);

                        e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                        e.Graphics.DrawLine(pen, 156, 850, 156, 895);
                        e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                        e.Graphics.DrawLine(pen, 297, 850, 297, 895);
                        e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                        e.Graphics.DrawLine(pen, 438, 850, 438, 895);
                        e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentetitulo, xbrushes, 355, 870);
                        e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                        e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                        e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                        e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                        // Pie de factura
                        e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION", fuentedetalle, xbrushes, 14, 977);
                        e.Graphics.DrawString("LEGAL POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                        e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                        e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                        e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                        e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                        e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                        e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                        //Valores de la tabla encabezado factura
                        foreach (DataRow dr in dtEncFactura.Rows)
                        {
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 878, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 898, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 918, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", numValorDcto), fuentetitulo, xbrushes, new Rectangle(650, 938, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 958, 100, 15), formato1);
                            if (dr["STRVALOR"].ToString().Trim().Length > 130)
                            {
                                e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                                e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                            }
                            else
                                e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                            RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                            StringFormat formato = new StringFormat();
                            formato.FormatFlags = StringFormatFlags.DirectionVertical;
                            e.Graphics.TranslateTransform(775, 977); //790, 977
                            e.Graphics.RotateTransform(180);
                            e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                            e.Graphics.RotateTransform(-180);
                        }
                    }
                    #endregion
                }

                imprimirPDF();
            }

            private void imprimirPagina2(PrintPageEventArgs e)
            {
                #region variables
                var dtEmpresa = _dts.Tables[0];
                var dtCliente = _dts.Tables[1];
                var dtEncFactura = _dts.Tables[2];
                var dtDetFactura = _dts.Tables[3];

                int fontsize = 6;
                var xbrushes = Brushes.Black;
                var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                var fuentenormal = new Font("Tahoma", fontsize);
                var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                var fuentelistadetalle = new Font("Arial", 5);
                var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                int numCantidadTallas = 0;
                int numLargoTitulo = 0;
                int numGuardaFila = 0;
                int numPar = 0;
                Int32 numArticulos = 0;
                int numContadorCol = 0;
                int numCuantos = 0;
                int numTamañoRef = 0;
                int numIzquierda = 550; //560

                StringFormat formato1 = new StringFormat();
                formato1.Alignment = StringAlignment.Far;
                formato1.LineAlignment = StringAlignment.Far;
                #endregion

                #region encabezado
                // Imprime el logo
                Image logo = Properties.Resources.artesalogo;
                e.Graphics.DrawImage(logo, 8, 10);

                // Titulo factura con numero
                e.Graphics.FillRectangle(Brushes.LightGray, numIzquierda, 20, 220, 40); //560,20,220,40
                e.Graphics.DrawString(strTipodeDocumento, fuentegrande, xbrushes, 590, 23); // 600,23
                e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 635, 40); //645,40

                // Control de paginacion
                e.Graphics.DrawString("Página:   2  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 695, 65); //705,65

                // Cuadro superior derecho
                e.Graphics.DrawRectangle(pen, new Rectangle(numIzquierda, 85, 220, 33)); //560, 85, 220, 33
                e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                e.Graphics.DrawLine(pen, numIzquierda, 96, 770, 96); //560,96,780,96
                e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                e.Graphics.DrawLine(pen, numIzquierda, 107, 770, 107); //560,107,780,107
                e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                #endregion

                e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                // Informacion empresa en la parte superior izquierda
                e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                // Cuado izquierdo vendido a
                e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString().Trim(), fuentetitulo, xbrushes, 90, 173);
                //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                e.Graphics.DrawString("VIA: ", fuentetitulo, xbrushes, 90, 183);

                // Cuadro derecho pedidos y ordenes
                e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 375, 60));  //395, 140, 385, 60
                e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                e.Graphics.DrawLine(pen, 395, 160, 770, 160);  //395, 160, 780, 160
                if (strOrdenes.Length < 66)
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                }
                else
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                    //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                    e.Graphics.DrawString(strOrdenes.Substring(67), fuentetitulo, xbrushes, 400, 185);
                }
                #endregion

                #region Titulos del Detalle factura
                //Encabezado de items de la factura
                numLargoTitulo = (numCantidadTallas * 10) + 20;
                e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 755, numLargoTitulo); //15, 210, 765
                e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 216);
                e.Graphics.DrawLine(pen, 80, 210, 80, 210 + numLargoTitulo);
                e.Graphics.DrawString("Descripción", fuentetitulo, xbrushes, 82, 216);
                e.Graphics.DrawLine(pen, 540, 210, 540, 210 + numLargoTitulo); //550, 210, 550, 210
                e.Graphics.DrawString("Cantidad", fuentetitulo, xbrushes, 542, 216); //555, 216
                e.Graphics.DrawLine(pen, 587, 210, 587, 210 + numLargoTitulo); //610, 210, 610, 210
                e.Graphics.DrawString("Descuento", fuentetitulo, xbrushes, 590, 216); //615, 216
                e.Graphics.DrawLine(pen, 643, 210, 643, 210 + numLargoTitulo); //670, 210, 670, 210
                // Parte final del encabezado de items de la factura
                e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 650, 216); //660, 216
                e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo); //725, 210, 725, 210 
                e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 720, 216); //720, 216

                #endregion

                #region Detalle factura
                numFila = 205;
                numColumna = 200;
                numGuardaFila = numFila + 15;
                numFila = numFila + 25;
                numCuentaLinea = 0;
                strReferencia = "";
                numPar = 1;
                double numValorDcto = 0;

                // Detalle de la factura
                foreach (DataRow dr in dtDetFactura.Rows)
                {
                    numCuentaLinea++;

                    if (numPaginas == 2 && numCuentaLinea > 50 && numCuentaLinea < 89)
                    {
                        numTamañoRef = dr["NOMREF_DFA"].ToString().Trim().Length;

                        e.Graphics.DrawString(dr["CODREF_DFA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                        e.Graphics.DrawString(dr["NOMREF_DFA"].ToString(), fuentedetalle, xbrushes, 82, numFila + 2);
                        e.Graphics.DrawString(dr["CANREF_DFA"].ToString(), fuentedetalle, xbrushes, 570, numFila + 2);
                        e.Graphics.DrawString(dr["DTOREF_DFA"].ToString(), fuentedetalle, xbrushes, 620, numFila + 2); //635
                        var xprecio = Convert.ToDouble(dr["PREREF_DFA"].ToString());
                        var xcanti = Convert.ToDouble(dr["CANREF_DFA"].ToString());
                        var xdcto = Convert.ToDouble(dr["DTOREF_DFA"].ToString());
                        numValorDcto = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : 0;

                        var valor = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : (xcanti * xprecio);
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", xprecio), fuentedetalle, xbrushes, new Rectangle(635, numFila, 60, 13), formato1); //655, numFila, 60, 13
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", valor), fuentedetalle, xbrushes, new Rectangle(705, numFila, 60, 13), formato1);

                        numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANREF_DFA"]);                        
                        numFila = numFila + 15;
                        numPar++;
                        if (numPar % 2 == 0)
                            e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 755, 15); //15, numFila, 765, 15
                    }

                    if (numPaginas > 2 && numCuentaLinea > 50 && numCuentaLinea < 101)
                    {
                        numTamañoRef = dr["NOMREF_DFA"].ToString().Trim().Length;

                        e.Graphics.DrawString(dr["CODREF_DFA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                        e.Graphics.DrawString(dr["NOMREF_DFA"].ToString(), fuentedetalle, xbrushes, 82, numFila + 2);
                        e.Graphics.DrawString(dr["CANREF_DFA"].ToString(), fuentedetalle, xbrushes, 570, numFila + 2);
                        e.Graphics.DrawString(dr["DTOREF_DFA"].ToString(), fuentedetalle, xbrushes, 620, numFila + 2); //635
                        var xprecio = Convert.ToDouble(dr["PREREF_DFA"].ToString());
                        var xcanti = Convert.ToDouble(dr["CANREF_DFA"].ToString());
                        var xdcto = Convert.ToDouble(dr["DTOREF_DFA"].ToString());
                        numValorDcto = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : 0;

                        var valor = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : (xcanti * xprecio);
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", xprecio), fuentedetalle, xbrushes, new Rectangle(635, numFila, 60, 13), formato1); //655, numFila, 60, 13
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", valor), fuentedetalle, xbrushes, new Rectangle(705, numFila, 60, 13), formato1);

                        numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANREF_DFA"]);
                        numFila = numFila + 15;
                        numPar++;
                        if (numPar % 2 == 0)
                            e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 755, 15); //15, numFila, 765, 15
                    }
                }

                // Lineas verticales den el detalle de la factura
                e.Graphics.DrawLine(pen, 80, numGuardaFila, 80, numFila);
                e.Graphics.DrawLine(pen, 540, numGuardaFila, 540, numFila); //550
                e.Graphics.DrawLine(pen, 587, numGuardaFila, 587, numFila); //610
                e.Graphics.DrawLine(pen, 643, numGuardaFila, 643, numFila); //670
                e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila); //725

                #endregion

                #region Pie de factura
                if (numPaginas == 2)
                {
                    // Cuadro inferior de totales
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 750, 125)); //15, 850, 760, 125
                    e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                    e.Graphics.DrawLine(pen, 580, 875, 765, 875); // 580, 875, 775, 875
                    e.Graphics.DrawLine(pen, 580, 895, 765, 895); // 580, 895, 775, 895
                    e.Graphics.DrawLine(pen, 580, 915, 765, 915); // 580, 915, 775, 915
                    e.Graphics.DrawLine(pen, 580, 935, 765, 935); // 580, 935, 775, 935
                    e.Graphics.DrawLine(pen, 580, 955, 765, 955); // 580, 955, 775, 955
                    e.Graphics.DrawLine(pen, 580, 975, 765, 975); // 580, 975, 775, 975

                    e.Graphics.DrawLine(pen, 670, 850, 670, 975);

                    e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                    e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 878);
                    e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 898);
                    e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 918);
                    e.Graphics.DrawString("DESCUENTO", fuentetitulo, xbrushes, 585, 938);
                    e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 958);

                    e.Graphics.DrawLine(pen, 15, 895, 580, 895);

                    e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                    e.Graphics.DrawLine(pen, 156, 850, 156, 895);
                    e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                    e.Graphics.DrawLine(pen, 297, 850, 297, 895);
                    e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                    e.Graphics.DrawLine(pen, 438, 850, 438, 895);
                    e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentetitulo, xbrushes, 355, 870);
                    e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                    e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                    e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                    e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                    // Pie de factura
                    e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION", fuentedetalle, xbrushes, 14, 977);
                    e.Graphics.DrawString("LEGAL POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                    e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                    e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                    e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                    e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                    e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                    e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                    //Valores de la tabla encabezado factura
                    foreach (DataRow dr in dtEncFactura.Rows)
                    {
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 878, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 898, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 918, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", numValorDcto), fuentetitulo, xbrushes, new Rectangle(650, 938, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 958, 100, 15), formato1);
                        if (dr["STRVALOR"].ToString().Trim().Length > 130)
                        {
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                            e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                        }
                        else
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                        RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                        StringFormat formato = new StringFormat();
                        formato.FormatFlags = StringFormatFlags.DirectionVertical;
                        e.Graphics.TranslateTransform(775, 977); //790, 977
                        e.Graphics.RotateTransform(180);
                        e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                        e.Graphics.RotateTransform(-180);
                    }
                }
                #endregion
            }

            private void imprimirPagina3(PrintPageEventArgs e)
            {
                #region variables
                var dtEmpresa = _dts.Tables[0];
                var dtCliente = _dts.Tables[1];
                var dtEncFactura = _dts.Tables[2];
                var dtDetFactura = _dts.Tables[3];

                int fontsize = 6;
                var xbrushes = Brushes.Black;
                var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                var fuentenormal = new Font("Tahoma", fontsize);
                var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                var fuentelistadetalle = new Font("Arial", 5);
                var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                int numCantidadTallas = 0;
                int numLargoTitulo = 0;
                int numGuardaFila = 0;
                int numPar = 0;
                Int32 numArticulos = 0;
                int numContadorCol = 0;
                int numCuantos = 0;
                int numTamañoRef = 0;
                int numIzquierda = 550; //560

                StringFormat formato1 = new StringFormat();
                formato1.Alignment = StringAlignment.Far;
                formato1.LineAlignment = StringAlignment.Far;
                #endregion

                #region encabezado
                // Imprime el logo
                Image logo = Properties.Resources.artesalogo;
                e.Graphics.DrawImage(logo, 8, 10);

                // Titulo factura con numero
                e.Graphics.FillRectangle(Brushes.LightGray, numIzquierda, 20, 220, 40); //560,20,220,40
                e.Graphics.DrawString(strTipodeDocumento, fuentegrande, xbrushes, 590, 23); // 600,23
                e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 635, 40); //645,40

                // Control de paginacion
                e.Graphics.DrawString("Página:   2  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 695, 65); //705,65

                // Cuadro superior derecho
                e.Graphics.DrawRectangle(pen, new Rectangle(numIzquierda, 85, 220, 33)); //560, 85, 220, 33
                e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                e.Graphics.DrawLine(pen, numIzquierda, 96, 770, 96); //560,96,780,96
                e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                e.Graphics.DrawLine(pen, numIzquierda, 107, 770, 107); //560,107,780,107
                e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                #endregion

                e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                // Informacion empresa en la parte superior izquierda
                e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                // Cuado izquierdo vendido a
                e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString().Trim(), fuentetitulo, xbrushes, 90, 173);
                //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                e.Graphics.DrawString("VIA: ", fuentetitulo, xbrushes, 90, 183);

                // Cuadro derecho pedidos y ordenes
                e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 375, 60));  //395, 140, 385, 60
                e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                e.Graphics.DrawLine(pen, 395, 160, 770, 160);  //395, 160, 780, 160
                if (strOrdenes.Length < 66)
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                }
                else
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                    //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                    e.Graphics.DrawString(strOrdenes.Substring(67), fuentetitulo, xbrushes, 400, 185);
                }
                #endregion

                #region Titulos del Detalle factura
                //Encabezado de items de la factura
                numLargoTitulo = (numCantidadTallas * 10) + 20;
                e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 755, numLargoTitulo); //15, 210, 765
                e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 216);
                e.Graphics.DrawLine(pen, 80, 210, 80, 210 + numLargoTitulo);
                e.Graphics.DrawString("Descripción", fuentetitulo, xbrushes, 82, 216);
                e.Graphics.DrawLine(pen, 540, 210, 540, 210 + numLargoTitulo); //550, 210, 550, 210
                e.Graphics.DrawString("Cantidad", fuentetitulo, xbrushes, 542, 216); //555, 216
                e.Graphics.DrawLine(pen, 587, 210, 587, 210 + numLargoTitulo); //610, 210, 610, 210
                e.Graphics.DrawString("Descuento", fuentetitulo, xbrushes, 590, 216); //615, 216
                e.Graphics.DrawLine(pen, 643, 210, 643, 210 + numLargoTitulo); //670, 210, 670, 210
                // Parte final del encabezado de items de la factura
                e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 650, 216); //660, 216
                e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo); //725, 210, 725, 210 
                e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 720, 216); //720, 216

                #endregion

                #region Detalle factura
                numFila = 205;
                numColumna = 200;
                numGuardaFila = numFila + 15;
                numFila = numFila + 25;
                numCuentaLinea = 0;
                strReferencia = "";
                numPar = 1;
                double numValorDcto = 0;

                // Detalle de la factura
                foreach (DataRow dr in dtDetFactura.Rows)
                {
                    numCuentaLinea++;

                    if (numPaginas == 3 && numCuentaLinea > 100 && numCuentaLinea < 139)
                    {
                        numTamañoRef = dr["NOMREF_DFA"].ToString().Trim().Length;

                        e.Graphics.DrawString(dr["CODREF_DFA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                        e.Graphics.DrawString(dr["NOMREF_DFA"].ToString(), fuentedetalle, xbrushes, 82, numFila + 2);
                        e.Graphics.DrawString(dr["CANREF_DFA"].ToString(), fuentedetalle, xbrushes, 570, numFila + 2);
                        e.Graphics.DrawString(dr["DTOREF_DFA"].ToString(), fuentedetalle, xbrushes, 620, numFila + 2); //635
                        var xprecio = Convert.ToDouble(dr["PREREF_DFA"].ToString());
                        var xcanti = Convert.ToDouble(dr["CANREF_DFA"].ToString());
                        var xdcto = Convert.ToDouble(dr["DTOREF_DFA"].ToString());
                        numValorDcto = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : 0;

                        var valor = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : (xcanti * xprecio);
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", xprecio), fuentedetalle, xbrushes, new Rectangle(635, numFila, 60, 13), formato1); //655, numFila, 60, 13
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", valor), fuentedetalle, xbrushes, new Rectangle(705, numFila, 60, 13), formato1);

                        numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANREF_DFA"]);
                        numFila = numFila + 15;
                        numPar++;
                        if (numPar % 2 == 0)
                            e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 755, 15); //15, numFila, 765, 15
                    }

                    if (numPaginas > 3 && numCuentaLinea > 50 && numCuentaLinea < 151)
                    {
                        numTamañoRef = dr["NOMREF_DFA"].ToString().Trim().Length;

                        e.Graphics.DrawString(dr["CODREF_DFA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                        e.Graphics.DrawString(dr["NOMREF_DFA"].ToString(), fuentedetalle, xbrushes, 82, numFila + 2);
                        e.Graphics.DrawString(dr["CANREF_DFA"].ToString(), fuentedetalle, xbrushes, 570, numFila + 2);
                        e.Graphics.DrawString(dr["DTOREF_DFA"].ToString(), fuentedetalle, xbrushes, 620, numFila + 2); //635
                        var xprecio = Convert.ToDouble(dr["PREREF_DFA"].ToString());
                        var xcanti = Convert.ToDouble(dr["CANREF_DFA"].ToString());
                        var xdcto = Convert.ToDouble(dr["DTOREF_DFA"].ToString());
                        numValorDcto = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : 0;

                        var valor = xdcto > 0 ? (xdcto / 100) * (xcanti * xprecio) : (xcanti * xprecio);
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", xprecio), fuentedetalle, xbrushes, new Rectangle(635, numFila, 60, 13), formato1); //655, numFila, 60, 13
                        e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", valor), fuentedetalle, xbrushes, new Rectangle(705, numFila, 60, 13), formato1);

                        numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANREF_DFA"]);
                        numFila = numFila + 15;
                        numPar++;
                        if (numPar % 2 == 0)
                            e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 755, 15); //15, numFila, 765, 15
                    }
                }

                // Lineas verticales den el detalle de la factura
                e.Graphics.DrawLine(pen, 80, numGuardaFila, 80, numFila);
                e.Graphics.DrawLine(pen, 540, numGuardaFila, 540, numFila); //550
                e.Graphics.DrawLine(pen, 587, numGuardaFila, 587, numFila); //610
                e.Graphics.DrawLine(pen, 643, numGuardaFila, 643, numFila); //670
                e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila); //725

                #endregion

                #region Pie de factura
                if (numPaginas == 3)
                {
                    // Cuadro inferior de totales
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 750, 125)); //15, 850, 760, 125
                    e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                    e.Graphics.DrawLine(pen, 580, 875, 765, 875); // 580, 875, 775, 875
                    e.Graphics.DrawLine(pen, 580, 895, 765, 895); // 580, 895, 775, 895
                    e.Graphics.DrawLine(pen, 580, 915, 765, 915); // 580, 915, 775, 915
                    e.Graphics.DrawLine(pen, 580, 935, 765, 935); // 580, 935, 775, 935
                    e.Graphics.DrawLine(pen, 580, 955, 765, 955); // 580, 955, 775, 955
                    e.Graphics.DrawLine(pen, 580, 975, 765, 975); // 580, 975, 775, 975

                    e.Graphics.DrawLine(pen, 670, 850, 670, 975);

                    e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                    e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 878);
                    e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 898);
                    e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 918);
                    e.Graphics.DrawString("DESCUENTO", fuentetitulo, xbrushes, 585, 938);
                    e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 958);

                    e.Graphics.DrawLine(pen, 15, 895, 580, 895);

                    e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                    e.Graphics.DrawLine(pen, 156, 850, 156, 895);
                    e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                    e.Graphics.DrawLine(pen, 297, 850, 297, 895);
                    e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                    e.Graphics.DrawLine(pen, 438, 850, 438, 895);
                    e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentetitulo, xbrushes, 355, 870);
                    e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                    e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                    e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                    e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                    // Pie de factura
                    e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION", fuentedetalle, xbrushes, 14, 977);
                    e.Graphics.DrawString("LEGAL POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                    e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                    e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                    e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                    e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                    e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                    e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                    //Valores de la tabla encabezado factura
                    foreach (DataRow dr in dtEncFactura.Rows)
                    {
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 878, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 898, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 918, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", numValorDcto), fuentetitulo, xbrushes, new Rectangle(650, 938, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 958, 100, 15), formato1);
                        if (dr["STRVALOR"].ToString().Trim().Length > 130)
                        {
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                            e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                        }
                        else
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                        RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                        StringFormat formato = new StringFormat();
                        formato.FormatFlags = StringFormatFlags.DirectionVertical;
                        e.Graphics.TranslateTransform(775, 977); //790, 977
                        e.Graphics.RotateTransform(180);
                        e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                        e.Graphics.RotateTransform(-180);
                    }
                }
                #endregion
            }

        #endregion

        #region eventos
            void _print_PrintPage(object sender, PrintPageEventArgs e)
            {
                try
                {
                    if (numPaginaActual == 1)
                    {
                        imprimirPagina1(e);
                    }
                    if (numPaginaActual == 2)
                    {
                        imprimirPagina2(e);
                    }
                    if (numPaginaActual == 3)
                    {
                        imprimirPagina3(e);
                    }
                   
                    if (numPaginas > numPaginaActual)
                    {
                        e.HasMorePages = true;
                        numPaginaActual++;
                    }
                    else
                        e.HasMorePages = false;
                }
                catch (Exception ex) { throw ex; }
            }
        #endregion
    }
}
